package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
	"time"
)

/*

1、复用一个链接
2、服务端断开之后，conn虽然发数据不报错，但是server收不到
3、可能发一个包过去，服务端会返回多个包回来，发包和收包必须异步。串行的话会堵住
4、异步回包，怎么将每次请求和每次返回对应上
5、如果服务端没启动，会拨号失败
6、服务端断开，客户端可以通过conn.read知道，会报Error reading EOF
7、客户端也会有粘包的问题
*/

func main() {
	//打开连接:
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		//由于目标计算机积极拒绝而无法创建连接
		fmt.Println("Error dialing", err.Error())
		return // 终止程序
	}
	if nerr, ok := err.(net.Error); ok && nerr.Timeout() { //可以判断出具体的网络错误类型
		time.Sleep(10 * time.Second)
	}

	inputReader := bufio.NewReader(os.Stdin)
	go ReadMsg(conn)

	// 给服务器发送信息直到程序退出：
	for {
		fmt.Println("想要发什么? 输入Q退出.")
		input, _ := inputReader.ReadString('\n')
		trimmedInput := strings.Trim(input, "\r\n")
		if trimmedInput == "Q" {
			return
		}
		conn.Write([]byte(trimmedInput))
	}
}

func ReadMsg(conn net.Conn) {
	for {
		buf := [512]byte{}
		n, err := conn.Read(buf[:])
		if err != nil {
			fmt.Println("recv failed, err:", err)
			return
		}
		fmt.Println(string(buf[:n]))
	}
}
